package com.hzit.aop.proxy.dynamic;

import com.hzit.aop.dao.UserDao;
import com.hzit.aop.dao.impl.UserDaoImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 类名：
 * 作者：WF
 * 功能：JDK的动态代理实现，通过实现与目标对象一样的接口莱创建代理对象
 */
public class UserDaoDynamicJDKImpl implements InvocationHandler {
	//1. 引入目标对象
	private UserDao userDao;
	public UserDaoDynamicJDKImpl(){
		userDao = new UserDaoImpl();
	}
	//2. 创建代理对象
	public UserDao createProxyObject(){
		// 参数1：类加载器对象
		// 参数2: 目标对象实现的接口数组
		// 参数3：实现了InvocationHandler接口的对象
		return (UserDao) Proxy.newProxyInstance(
				this.getClass().getClassLoader(),
				userDao.getClass().getInterfaces(),
				this);
	}

	//3. 帮我们调用目标对象的对应方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		if(method.getName().equals("query")){
			checkSecurity();
		}
		return method.invoke(userDao, args);
	}

	private void checkSecurity(){
		System.out.println("JDK动态代理正在进行安全性检查。。。");
	}
}
